HBase写入以及MVCC

       HBase中的写入方法有主要分为实时的put以及批量导入bulkload,这里主要介绍一下实时写入put以及一些HBase里面与MVCC相关的东西,版本依旧是社区版1.0.0。

       在regionserver服务端,与put相关的操作差不多最后都会调用到HRegion的doMiniBatchMutation(BatchOperationInProgress)方法,以下截图是从RSRpcServices的mutate方法一直到该方法的调用栈(从下往上看)。

put(或者叫mutate)在regionserver中的方法调用栈

       下面主要看doMiniBatchMutation方法,这个方法主要处理mutate(例如put、delete)以及replay过程,关于replay的过程会选择性的跳过。

       函数体中有很详细的注释,主要把一个批量mutate过程分为了以下几个步骤:

1.获取相关的锁,由于HBase要确保行一级的原子性,所以获取锁的时候获取的是整个rowkey的锁而不是单个cell的锁;也只有当至少获取一个锁的时候,这个方法才会继续,否则直接返回。

2.更新cell中的时间戳(timestamp)以及获取mvcc相关参数,其中timestamp(也可以叫做version)可以在客户端自己手动指定,所以在一致性上不能用来做参考,也许正是因此才会引入一个叫做sequenceId的概念(当然更多的用途是为了保证修改操作在HLog里面的顺序)来完成mvcc,最后会介绍一下mvcc以及在这里HBase是如何处理mvcc的。

3.将这些put操作写入memstore,虽然数据库系统中写日志永远比写数据重要,但是这里可以认为当前“事务”尚未提交,即使现在挂了没有日志恢复也不要紧,因为这个“事务”是没有提交的。

4.构建walEdit,这一步主要是为了构建WALEdit类型的walEdit变量,这个变量主要是以list的形式聚合了很多HBase里面cell的概念,以后会写入到HLog中。

5.追加刚才构建好的walEdit:首先构造一个walKey,注意这里的walKey的sequenceId为默认值-1,到后面才会修改为跟region挂钩的唯一递增id;接着调用wal的append方法并返回一个递增数值(txid),用来表示这个追加到wal内存中日志条目的编号,在第七步中这个数值将会作为参数传入,确保该数值之前的日志信息都被写入到HLog日志文件中,而且在append方法中会保证walKey的sequenceId变成了region的sequenceId(也是一个递增序列)。

6.释放获取的锁。

7.将wal写入磁盘,正如第五步所说,这里保证txid以及之前的日志条目都被写入到日志文件中了,一旦写完便可以认为这个“事务”成功了,这里跟MySQL里面的auto commit很像。

8.提交本次操作,让put操作对读可见,核心步骤就是增加对应memstore的readpoint,使得以前讲的MemStoreScanner可以看见put过来的数据,这根后面讲的mvcc有关。


关于HBase里面的MVCC

       mvcc即多版本并发控制,针对的问题就就是在数据库系统中,什么样的数据是应该被看到的,什么样的数据即使有也不应该被读取,典型的情况就是uncommitted的数据。现在的数据库系统即使不是通过天然具有递增属性的时间也是通过类似的递增数列完成mvcc的,给每一条插入的数据按照时间打个标签T,读取事务开始的时候也获取当前时间t,这个读取事务只能读取T<t的数据。

      假设现在线程A执行完上面的第三步,将C这个cell插入到了memstore中,正在此时线程B要读取对应rowkey的所有数据,那么C该不该被读取到呢?HBase里面的事物隔离级别默认情况下可以说是“read committed”所以C明显不该被读取,要如何避免呢?timestamp字段默认情况下是服务端的系统时间,但是用户可以在客户端随意修改覆盖,不能用作mvcc。但是刚好put(或者说是mutate操作)在wal中是有序的,还是根据region提供的sequenceId生成的唯一递增序列,可以用这种唯一递增序列来做饭多版本并发控制的效果。接下来只需要保证每次到了第八步的时候保证memstore的readpoint大于已经提交的最大sequenceId,就可以正确读取了。生成这个与mvcc相关的sequenceId是在上面的第二个步骤中进行的。

       但是有个问题没有解决,很有可能先开始的事务A(假设sequenceId为1)比后开始的事务B(假设sequenceId为2)晚完成。B完成之后将memstore的readpoint设置为2了,这样后面的读取不就可以通过memstore暴露的api读取到A尚未提交的数据了吗?在HBase中与mvcc相关的类里面尚未提交的put操作对应的sequenceId都增加了10亿,以保证在没有提交之前这些数据是不能读取到的,这样一来,A在没有提交之前对应的sequenceId实际是1000000001,根据目前的sequenceId(2)是看不到的。

       以上是关于HBase里面写入的理解,但是有个问题就是找了好久都没发现第八步完成后是怎样从第三步的memstore里面的减去这多加的10亿。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容